home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 21 / Cream of the Crop 21 (Terry Blount) (October 1996).iso / program / oxcc1434.zip / DOC / C.GRM < prev    next >
Text File  |  1995-11-06  |  17KB  |  976 lines

  1. /*--- C grammar with extensions for oxcc multipass compiler ---*/
  2. /* 
  3.     Norman D. Culver 
  4.     Oxbow Software
  5.     1323 S.E. 17th Street #662
  6.     Ft. Lauderdale, FL 33316
  7.     (305) 527-1663 Voice
  8.     (305) 760-7584 Fax
  9.     (305) 760-4679 Data
  10.     norman.culver@channel1.com
  11.     ndc@gcomm.com
  12.  
  13.     Copyright 1994 by Norman D. Culver, All Rights Reserved.
  14. */
  15. /* 
  16.     NOTE -- THE DEADWOOD IN THIS GRAMMAR IS THERE BECAUSE OF THE NEED TO
  17.     RUNTIME INTERPRET AND/OR REGENERATE SOURCE FROM THE AST TREE
  18.  
  19.     NOTE -- PRODUCTIONS TERMINATED WITH $$; DO NOT MAKE AST NODES
  20.  
  21.     NOTE -- THE COMPILER COMPILER DERIVES ANY UNFORCED TERMINALS
  22.  
  23.     NOTE -- THIS IS THE ACTUAL GRAMMAR USED BY THE PARSER GENERATOR `lrg'
  24. */
  25.  
  26. /* Force a couple of terminal symbol values */
  27. #1    {meta-name}
  28. #2    {typedef-name}
  29.  
  30. /*--- Operator Precedence. ---*/
  31.  
  32.   !(  '?'                      )
  33.   !(  '||'                     )
  34.   !(  '&&'                     )
  35.   !(  '|'                      )
  36.   !(  '^'                      )
  37.   !(  '&'                      )
  38.   !(  '=='  '!='               )
  39.   !(  '<'   '>'   '<='   '>='  )
  40.   !(  '<<'  '>>'               )
  41.   !(  '+'   '-'                )
  42.   !(  '*'   '/'   '%'          )
  43.  
  44. /*--- Phrase Structure Grammar ---*/
  45.  
  46. File
  47.     -> [Input]... <eof>        ;
  48.  
  49. Input
  50.     -> OuterDecl    $$;
  51.     -> FuncDef        $$;
  52.     -> Directive    $$;
  53.     -> OuterAnf        $$;
  54.     -> SegStuff        $$;
  55.  
  56. SegStuff
  57.     ->    __segdef__ DeclID [SegList] ';'    ;
  58.     ->    __seguse__ DeclID ';'            ;
  59.  
  60. SegList
  61.     ->    ConstExp \','...    $$;
  62.  
  63. FuncDef
  64.     -> [FrontSpec]        
  65.         FuncDeclarator                
  66.         [Attr]
  67.         [InnerDecl]...
  68.         FuncBody            ;
  69.  
  70. NestedFuncDef
  71.     -> FrontSpec        
  72.         FuncDeclarator
  73.         FuncBody            ;
  74.  
  75. FuncDeclarator
  76.     -> Declarator ;
  77.  
  78. FuncBody
  79.     -> LB
  80.         [DeclOrFunc]...
  81.         [StmtC]...
  82.        BodyExit                 ;
  83.  
  84. BodyExit
  85.     ->    RB    ;
  86.  
  87. OuterDecl
  88.     -> [FrontSpec] [InitDeclarator \','...] ';' 
  89.         => classify (typedef 'InitDeclarator' 'TypeAgain' 'ParenDeclarator' 
  90.             'DeclID' <identifier> {meta-name} {typedef-name})  ;
  91.  
  92. InnerDecl
  93.     -> FrontSpec [InitDeclarator \','...] ';'
  94.         => classify (typedef 'InitDeclarator' 'TypeAgain' 'ParenDeclarator' 
  95.             'DeclID' <identifier> {meta-name} {typedef-name}) ;
  96.  
  97. FrontSpec
  98.     -> TypeDefs                $$;
  99.     -> DeclarationSpec...    $$;
  100.  
  101. TypeDefs
  102.     -> TypeDef TdElem...                $$;
  103.     -> TypeDef Esu...                    $$;
  104.     -> TypeDef TypedefName                $$;
  105.     -> TypeDef TypeAgain \','...        $$;
  106.  
  107. TypeDef
  108.     -> typedef         ;
  109.  
  110. TdElem
  111.     ->    Type        $$;
  112.     ->    Qualifier    $$;
  113.  
  114. TypeAgain
  115.     -> TypedefName InitRHS    ;    /* reuse of computed typedef */
  116.     -> Identifier InitRHS    ;
  117.  
  118. DeclarationSpec
  119.     -> TypeSpec                $$;
  120.     -> StorageClassSpec        $$;
  121.     -> Qualifier            $$;
  122.     -> FuncTypeModifier        $$;
  123.  
  124. InitDeclarator
  125.     -> Declarator [Attr]            ;
  126.     -> Declarator [Attr] InitRHS    ;
  127.  
  128. Declarator
  129.     -> [Pointer] DirectDeclarator         $$;
  130.  
  131. Pointer
  132.     -> '*' [Qualifier]...                ;
  133.     -> '*' [Qualifier]... Pointer        ;
  134.  
  135. DirectDeclarator
  136.     -> DeclID                            $$;
  137.     -> ParenDeclarator                     $$;
  138.     -> DirectDeclarator ArrayDecl        $$;
  139.     -> DirectDeclarator FuncParams        $$;
  140.  
  141. DeclID
  142.     -> <identifier>    ;
  143.     -> {meta-name}    ;
  144.  
  145. ParenDeclarator
  146.     -> '(' Declarator ')' ;
  147.  
  148. ArrayDecl
  149.     -> '[' [BinopC] ']' ;
  150.  
  151. FuncParams
  152.     -> '(' [ParamList] ')' ;
  153.  
  154. ParamList
  155.     -> Param \','...            ;
  156.     -> Param \','... ',' '...'    ;
  157.     -> '...' ;
  158.  
  159. Param
  160.     -> SpecQual... InitDeclarator        ;
  161.     -> SpecQual... [NoNameDeclarator]    ;
  162.     -> Identifier ;
  163.  
  164. NoNameDeclarator
  165.     -> Pointer                            ;
  166.     -> [Pointer] DirectNoNameDeclarator    ;
  167.  
  168. DirectNoNameDeclarator
  169.     -> ParenNoNameDeclarator                        $$;
  170.     -> [DirectNoNameDeclarator] ArrayDecl            $$;
  171.     -> [DirectNoNameDeclarator] FuncParams            $$;
  172.  
  173. ParenNoNameDeclarator
  174.     -> '(' NoNameDeclarator ')' ;
  175.  
  176. InitRHS
  177.     -> '=' Init    ;
  178.  
  179. TypeSpec
  180.     -> Specs        $$;
  181.     -> DynType        $$;
  182.  
  183. DynType
  184.     -> TypedefName    $$;
  185.     -> TypeOf        $$;
  186.  
  187. Specs
  188.     -> Type            $$;
  189.     -> Esu            $$;
  190.  
  191. Esu
  192.     -> EnumSpec        $$;
  193.     -> StructSpec    $$;
  194.     -> UnionSpec    $$;
  195.  
  196. Type
  197.     -> void        ;
  198.     -> char        ;
  199.     -> short    ;
  200.     -> int        ;
  201.     -> long        ;
  202.     -> float    ;
  203.     -> double    ;
  204.     -> signed    ;
  205.     -> unsigned    ;
  206.     -> _segment    ;
  207.     -> __segment ;
  208.     
  209. FuncTypeModifier
  210.     -> inline        ;
  211.     -> __inline__    ;
  212.     -> __inline        ;
  213.     -> _cdecl        ;
  214.     -> __cdecl        ;
  215.     -> _pascal        ;
  216.     -> __pascal        ;
  217.     -> _fortran        ;
  218.     -> __fortran    ;
  219.     -> _interrupt    ;
  220.     -> __interrupt    ;
  221.     -> _ifunc        ;
  222.     -> _loadds        ;
  223.     -> __loadds        ;
  224.     -> _export        ;
  225.     -> __export        ;
  226.     -> _fastcall    ;
  227.     -> _saveregs    ;
  228.     -> __saveregs    ;
  229.     -> _syscall        ;
  230.     -> __syscall    ;
  231.     -> _stdcall        ;
  232.     -> __stdcall    ;
  233.  
  234. Qualifier
  235.     -> Based        ;
  236.     -> const        ;
  237.     -> volatile        ;
  238.     -> __volatile__    ;
  239.     -> _far            ;
  240.     -> __far        ;
  241.     -> _near        ;
  242.     -> __near        ;
  243.     -> _huge        ;
  244.     -> __huge        ;
  245.     -> _seg16        ;
  246.     -> __seg16        ;
  247.     -> _far16        ;
  248.     -> __far16        ;
  249.     -> register        ;
  250.  
  251. Based
  252.     -> _based '(' BaseExp ')'    $$;
  253.     -> __based '(' BaseExp ')'    $$;
  254.     
  255. BaseExp
  256.     ->  CastExp    ;
  257.     -> _self    ;
  258.     -> __self    ;
  259.  
  260. SpecQual
  261.     -> TypeSpec        $$;
  262.     -> Qualifier    $$;
  263.  
  264. TypedefName
  265.     -> {meta-name} => require ({meta-name} {typedef-name}) ;
  266.  
  267. TypeOf
  268.     -> typeof '(' CastExp ')'    ;
  269.  
  270. StorageClassSpec
  271.     -> extern        ;
  272.     -> static        ;
  273.     -> _ival        ;
  274.     -> auto            $$;
  275.  
  276. StructSpec    
  277.     -> struct Tag                                    ;
  278.     -> struct '{' StructMembers... '}'                ;
  279.     -> struct Tag '{' StructMembers... '}'            ;
  280.     -> _Packed struct '{' StructMembers... '}'        ;
  281.     -> _Packed struct Tag '{' StructMembers... '}'    ;
  282.  
  283. UnionSpec
  284.     -> union Tag    ;
  285.     -> union '{' StructMembers... '}'        ;
  286.     -> union Tag '{' StructMembers... '}'     ;
  287.  
  288. StructMembers
  289.     -> MemberSpec Members ';'    ;  /* Allow unnamed structs and unions etc. */
  290.  
  291. MemberSpec
  292.     -> [Qualifier]... Type...     $$;    /* restrictions should be removed */
  293.     -> [Qualifier]... Esu        $$;
  294.     -> [Qualifier]... DynType    $$;
  295.  
  296. Members
  297.     -> SMember \','... $$;
  298.  
  299. SMember
  300.     -> Member    $$;
  301.     -> Bitfield    $$;
  302.  
  303. Member
  304.     -> MemberDeclarator [Attr] ;
  305.     -> [Attr] ;
  306.  
  307. Bitfield
  308.     -> FieldSize [Attr] ;
  309.     -> MemberDeclarator FieldSize [Attr] ;
  310.  
  311. FieldSize
  312.     -> ':' BinopC ;
  313.  
  314. MemberDeclarator
  315.     -> [Pointer] DirectDeclarator    $$;
  316.  
  317. EnumSpec
  318.     -> enum Tag                                        ;
  319.     -> enum '{' Enumerator \','... [','] '}'        ;
  320.     -> enum Tag '{' Enumerator \','... [','] '}'    ;
  321.  
  322. Tag
  323.     -> <identifier> ;
  324.     -> {meta-name}    ;
  325.  
  326. Enumerator
  327.     -> EnumID            ;
  328.     -> EnumID EnumInit    ;
  329.  
  330. EnumID
  331.     -> <identifier> ;
  332.  
  333. EnumInit
  334.     -> '=' BinopC ;
  335.  
  336. Init
  337.     -> InitBlock    $$;
  338.     -> InitExp        $$;
  339.  
  340. InitBlock
  341.     -> '{' InitInner \','... [','] '}'    ;
  342.  
  343. InitExp
  344.     -> AssignExp        ;
  345.  
  346. InitInner
  347.     -> InitId InitBlock    $$;
  348.     -> InitId InitExp    $$;
  349.     -> InitBlock        $$;
  350.     -> InitExp            $$;
  351.  
  352. InitId
  353.     ->    AryElem...    '='        ;
  354.     ->    '.' InitLabel '='    ;
  355.     ->  InitLabel ':'         ;
  356.  
  357. AryElem
  358.     -> '[' InitElem ']'    $$;
  359.  
  360. InitElem
  361.     ->    Constant    ;
  362.  
  363. InitLabel
  364.     -> <identifier> ;
  365.     -> {meta-name}    ;
  366.  
  367. Attr
  368.     -> Attr1 '(' Constant ')' ')' ')'    ;
  369.     -> Attr1 ')' ')'                    ;
  370.     -> Attr1 '(' Identifier ')' ')' ')'    ;
  371.     -> Attr1 '(' Identifier ',' Constant ',' Constant ')' ')' ')'    ;
  372.  
  373. Attr1
  374.     -> __attribute__ '(' '(' AttrId    $$;
  375.  
  376. AttrId
  377.     -> <identifier> ;
  378.     -> {meta-name}    ;
  379.  
  380. /* Statements */
  381.  
  382. StmtC
  383.     -> ';'                                        ;            /*0*/
  384.     -> Exp ';'                                    ;            /*1*/
  385.     -> goto Identifier ';'                        ;            /*2*/
  386.     -> continue ';'                                ;            /*3*/
  387.     -> break ';'                                ;            /*4*/
  388.     -> return [RetExp] ';'                        ;            /*5*/
  389.     -> if '(' IfExp ')' IfStmtC                    ;            /*6*/
  390.     -> if '(' IfExp ')' IfStmtC else ElseStmtC    ;            /*7*/
  391.     -> switch '(' SwExp ')' SwStmtC                ;            /*8*/
  392.     -> while '(' WhileExp ')' WhileStmtC        ;            /*9*/
  393.     -> do DoStmtC while '(' DoExp ')' ';'        ;            /*10*/
  394.     -> for '(' [ForInit] FS1 [ForCond] FS2 [ForPost] ')' ForStmtC    ;    /*11*/
  395.     -> BlockC                                    ;            /*12*/
  396.     -> Label ':' [StmtC]                        ;            /*13*/
  397.     -> AsmStmt                                    ;            /*14*/
  398.     -> AnfBlock                                    ;            /*15*/
  399.  
  400. FS1
  401.     -> ';' ;
  402. FS2
  403.     -> ';' ;
  404.  
  405. RetExp
  406.     -> Exp    ;
  407.  
  408. IfExp
  409.     -> Exp    ;
  410.  
  411. SwExp
  412.     -> Exp    ;
  413.     
  414. WhileExp
  415.     -> Exp    ;
  416.  
  417. DoExp
  418.     -> Exp    ;
  419.  
  420. IfStmtC
  421.     -> StmtC    ;
  422.  
  423. ElseStmtC
  424.     -> StmtC    ;
  425.     
  426. DoStmtC
  427.     -> StmtC    ;
  428.  
  429. WhileStmtC
  430.     -> StmtC    ;
  431.     
  432. ForStmtC
  433.     -> StmtC    ;
  434.  
  435. SwStmtC
  436.     -> StmtC    ;
  437.  
  438. ForInit
  439.     -> Exp    ;
  440.  
  441. ForCond
  442.     -> Exp    ;
  443.  
  444. ForPost
  445.     -> Exp    ;
  446.  
  447. BlockC
  448.     -> BlockEntry
  449.         [Local]...
  450.         [DeclOrFunc]...
  451.         [StmtC]...
  452.        BlockExit                 ;
  453.  
  454. BlockEntry
  455.     ->    LB    ;
  456.  
  457. BlockExit
  458.     -> RB ;
  459.  
  460. DeclOrFunc
  461.     -> InnerDecl        $$;
  462.     -> NestedFuncDef    $$;
  463.  
  464. Local
  465.     -> __label__ Local